class Node:
    def __init__(self,start,end):
        # 每个节点有对应的start,end属性
        # 用于判断其子节点应该为左子树还是右子树
        self.start = start
        self.end = end

        self.left, self.right = None, None

    def insert(self, node):
        # self: root
        # 待插入节点的时间区间在当前节点的时间区间后，插入其右子树
        if node.start >= self.end:
            # 当前节点不存在右子树
            # 直接将待插入节点作为其右子树
            if not self.right:
                self.right = node
                return True
            # 当前节点存在右子树，将右子树作为root，进一步判断右子树与待插入节点的区间关系。
            return self.right.insert(node)
        # 待插入节点的时间区间在当前节点的时间区间前，插入其左子树
        elif node.end <= self.start:
            # 当前节点不存在左子树
            # 直接将待插入节点作为其左子树
            if not self.left:
                self.left = node
                return True
            # 当前节点存在左子树，将左子树作为root，进一步判断左子树与待插入节点的区间关系。
            return self.left.insert(node)
        # 区间重合，插入失败
        else:
            return False
class MyCalendar:

    def __init__(self):

       self.root = None

    def book(self, start: int, end: int) -> bool:
        # 第一次book,root为空
        if not self.root:
            self.root = Node(start,end)
            return True
        # root不为空，插入子节点
        return self.root.insert(Node(start,end))
